package com.classic.car.ui.chart; import com.classic.car.R; import com.classic.car.entity.ConsumerDetail; import com.classic.car.entity.FuelConsumption; import com.classic.car.utils.DataUtil; import com.classic.car.utils.MoneyUtil; import com.classic.car.utils.Util; import com.github.mikephil.charting.charts.LineChart; import com.github.mikephil.charting.components.Legend; import com.github.mikephil.charting.components.XAxis; import com.github.mikephil.charting.components.YAxis; import com.github.mikephil.charting.data.ChartData; import com.github.mikephil.charting.data.Entry; import com.github.mikephil.charting.data.LineData; import com.github.mikephil.charting.data.LineDataSet; import com.github.mikephil.charting.formatter.IValueFormatter; import com.github.mikephil.charting.utils.ViewPortHandler; import java.util.ArrayList; import java.util.List; /** * 应用名称: CarAssistant * 包 名 称: com.classic.car.ui.chart * * 文件描述: TODO * 创 建 人: 续写经典 * 创建时间: 2017/3/28 19:55 */ public class LineChartDisplayImpl extends BaseChartDisplayImpl<LineChart, LineChartDisplayImpl.LineChartData>{ @Override public void init(LineChart chart, boolean touchEnable) { super.init(chart, touchEnable); //超过这个值,不显示value chart.setMaxVisibleValueCount(MAX_VISIBLE_VALUE_COUNT * 2); chart.setDrawGridBackground(false); if (touchEnable) { // enable scaling and dragging // lineChart.setDragEnabled(true); // lineChart.setScaleEnabled(true); // lineChart.setHighlightPerDragEnabled(true); // if disabled, scaling can be done on x- and y-axis separately chart.setPinchZoom(true); } YAxis leftAxis = chart.getAxisLeft(); leftAxis.setAxisMinimum(1); leftAxis.setTextSize(mAxisSize); leftAxis.enableGridDashedLine(10f, 10f, 0f); leftAxis.setTextColor(Util.getColor(mAppContext, R.color.gray_dark)); chart.getAxisRight().setEnabled(false); XAxis xAxis = chart.getXAxis(); xAxis.setPosition(XAxis.XAxisPosition.BOTTOM); xAxis.setDrawGridLines(false); xAxis.setTextSize(mAxisSize); xAxis.setAxisMinimum(MINIMUM_VALUE); xAxis.setTextColor(Util.getColor(mAppContext, R.color.gray_dark)); chart.getLegend().setForm(Legend.LegendForm.LINE); chart.getLegend().setTextSize(mTextSize); chart.getLegend().setTextColor(Util.getColor(mAppContext, R.color.gray_dark)); } @Override public LineChartData convert(List<ConsumerDetail> list) { if (DataUtil.isEmpty(list)) { return null; } LineChartData lineChartData = new LineChartData(); lineChartData.fuelConsumptions = new ArrayList<>(); final int size = list.size() - 1; for (int i = 0; i < size; i++) { ConsumerDetail startItem = list.get(i); ConsumerDetail endItem = list.get(i + 1); long mileage = endItem.getCurrentMileage() - startItem.getCurrentMileage(); mileage = mileage > 0L ? mileage : 0L; float money = mileage == 0L ? 0F : MoneyUtil.newInstance(startItem.getMoney()).multiply(100).divide(mileage).create().floatValue(); final float oilMass = startItem.getUnitPrice() == 0F ? 0F : MoneyUtil.newInstance(money).divide(startItem.getUnitPrice()).create().floatValue(); FuelConsumption item = new FuelConsumption(mileage, Float.valueOf(MoneyUtil.replace(money)), Float.valueOf(MoneyUtil.replace(oilMass))); lineChartData.fuelConsumptions.add(item); if (null == lineChartData.minFuelConsumption || item.getMoney() < lineChartData.minFuelConsumption.getMoney()) { lineChartData.minFuelConsumption = item; } if (null == lineChartData.maxFuelConsumption || item.getMoney() > lineChartData.maxFuelConsumption.getMoney()) { lineChartData.maxFuelConsumption = item; } } lineChartData.lineData = convertLineData(lineChartData.fuelConsumptions); return lineChartData; } @Override ChartData getChartData(LineChartData lineChartData) { return null == lineChartData ? null : lineChartData.lineData; } public static class LineChartData { public LineData lineData; public FuelConsumption minFuelConsumption; public FuelConsumption maxFuelConsumption; public List<FuelConsumption> fuelConsumptions; } /** 油耗曲线数据显示 */ private static final IValueFormatter OIL_MESS_FORMATTER = new IValueFormatter() { @Override public String getFormattedValue(float value, Entry entry, int dataSetIndex, ViewPortHandler viewPortHandler) { return MoneyUtil.replace(MoneyUtil.newInstance(value).round(2).create()); } }; private LineData convertLineData(List<FuelConsumption> list){ if(DataUtil.isEmpty(list)){ return null; } ArrayList<Entry> moneyValues = new ArrayList<>(); ArrayList<Entry> oilMessValues = new ArrayList<>(); final int size = list.size(); for (int i = 0; i < size; i++) { moneyValues.add(new Entry(i, list.get(i).getMoney())); oilMessValues.add(new Entry(i, list.get(i).getOilMass())); } LineDataSet moneySet = new LineDataSet(moneyValues, Util.getString(mAppContext, R.string.chart_fuel_consumption_money)); applyLineDataSetStyle(moneySet, Util.getColor(mAppContext, R.color.colorAccent)); LineDataSet oilMessSet = new LineDataSet(oilMessValues, Util.getString(mAppContext, R.string.chart_fuel_consumption)); applyLineDataSetStyle(oilMessSet, Util.getColor(mAppContext, R.color.blue)); return new LineData(moneySet, oilMessSet); } private void applyLineDataSetStyle(LineDataSet lineDataSet, int color) { lineDataSet.setAxisDependency(YAxis.AxisDependency.LEFT); lineDataSet.setColor(color); lineDataSet.setCircleColor(color); lineDataSet.setValueTextSize(mTextSize); lineDataSet.setValueFormatter(OIL_MESS_FORMATTER); //moneySet.setCircleRadius(5f); //圆点半径 //moneySet.setDrawCircleHole(false); //圆点是否空心 //moneySet.setCircleHoleRadius(3f); //空心半径 //moneySet.setHighlightEnabled(true); //选中高亮 //moneySet.enableDashedLine(10f, 5f, 0f); //启用虚线 //moneySet.enableDashedHighlightLine(10f, 5f, 0f); //启用高亮虚线 } }